<?php

declare(strict_types=1);

namespace App\Controllers;

use App\Services\UserService;
use HttpException\ClientError\BadRequestException;
use HttpException\ClientError\ConflictException;
use HttpException\ClientError\NotFoundException;

class UserController extends BaseController
{
    /**
     * Obtiene solo los campos necesarios de la petición.
     */
    private function getFields(): array
    {
        return ['email', 'username', 'role_id', 'fullname', 'is_active', 'password', 'password_confirm'];
    }

    /**
     * Obtiene una instancia del servicio.
     */
    private function userService(): UserService
    {
        return new UserService($this->app());
    }

    /**
     * Registra la información de un usuario.
     */
    public function create(): void
    {
        $data = [];

        // Obtiene solo los campos necesarios.
        foreach ($this->getFields() as $field) {
            $data[$field] = $this->app()->request()->data->{$field} ?? null;
        }

        try {
            $user = $this->userService()->register($data);
        } catch (BadRequestException $e) {
            $this->respondValidationError($this->app()->gump()->get_errors_array(), $e->getMessage());
        } catch (ConflictException $e) {
            $this->respondResourceExists($e->getMessage());
        }

        $this->respondCreate($user, 'El usuario se ha creado correctamente');
    }

    /**
     * Muestra la información de un usuario.
     */
    public function show(string $id): void
    {
        try {
            $user = $this->userService()->getDetailsById($id);
        } catch (BadRequestException $e) {
            $this->respondValidationError($this->app()->gump()->get_errors_array(), $e->getMessage());
        } catch (NotFoundException $e) {
            $this->respondNotFound($e->getMessage());
        }

        $this->respond($user, 'Información acerca del usuario');
    }
}
